Сліпий підпис
Сліпий підпис (англ. blind signature) — різновид електронного цифрового підпису, особливістю якого є те, що сторона, яка підписує, не може точно знати вміст підписаного документа. Поняття «сліпий підпис» придумано Девідом Чаумом[en][1] в 1982 році, ним же запропонована перша реалізація через алгоритм RSA. Безпека схеми сліпого підпису ґрунтувалася на складності факторизації великих складених чисел. З тих пір було запропоновано велику кількість інших схем[2][3].
Основна ідея сліпих підписів полягає в наступному:
- Відправник А шифрує документ і надсилає його стороні В.
- Сторона, не бачачи вміст документа, підписує його і повертає назад стороні А.
- Сторона А знімає свій шифр, залишаючи на документі тільки підпис сторони В.
По завершенні цього протоколу сторона В нічого не знає ні про повідомлення t, ні про підписи під цим повідомленням.
Цю схему можна порівняти з конвертом, в якому розміщений документ і копіювальний лист. Якщо підписати конверт, то підпис віддрукується на документі, і при розтині конверта документ вже буде підписаний.
Мета сліпого підпису полягає в тому, щоб перешкодити підписувачу В ознайомитися з повідомленням сторони А, яку він підписує, і з відповідним підписом під цим повідомленням. Тому надалі підписане повідомлення неможливо пов'язати зі стороною А.
Схема безпечного сліпого підпису повинна задовольняти 3 властивостям, а саме:
- Нульове розголошування. Ця властивість допомагає користувачеві отримати підпис на даному повідомленні, не розкриваючи самого повідомлення підписуючій стороні.
- Невідстежуваність. Підписуюча сторона не може відстежити пару підпис-повідомлення після того, як користувач оприлюднив підпис на повідомленні.
- Непідкладність. Тільки підписуча сторона може сгенерувати дійсний підпис. Ця властивість найважливіша і повинна задовольнятися для всіх схем підписів.
Завдяки властивостям нульового розголошення і невідстежуваності, схема сліпого підпису може бути широко задіяна в додатках, де необхідна конфіденційність, наприклад, в системах електронного голосування[4][5][6][7].
Дана ситуація: Боб — нотаріус. Алісі потрібно, щоб він підписав документ, не маючи ніякого уявлення про його зміст. Боб лише завірює, що документ нотаріально засвідчений в зазначений час. Тоді вони діють за таким алгоритмом:
У цій схемі Аліса хоче, щоб Боб наосліп підписав повідомлення . Для цього:
- Аліса зашифровує повідомлення функцією ., отримуючи зашифроване повідомлення .
- Аліса відсилає зашифроване повідомлення Бобу.
- Боб наосліп (так як не знає, що знаходиться всередині) підписує повідомлення функцією , отримуючи .
- Боб посилає назад Алісі.
- Аліса отримує і прибирає своє шифрування, отримуючи: .
Цей протокол працює, тільки якщо функції підпису та шифрування комутативні.
- Боб готує n документів на кожному з яких написано деяке унікальне слово (чим більше n, тим менше у Боба шансів зшахраювати).
- Боб маскує кожен документ унікальним маскуючим множником і відправляє їх Алісі.
- Аліса отримує всі документи і випадковим чином вибирає n-1 з них.
- Аліса просить Боба вислати маскуючі множники для вибраних документів.
- Боб робить це.
- Аліса розкриває n-1 документів і переконується, що вони коректні.
- Аліса підписує останній документ і відсилає Бобу.
- Тепер у Боба є підписаний Алісою документ з унікальним словом, яке Аліса не знає.
Перша реалізація сліпих підписів була здійснена Чаумом з допомогою криптосистеми RSA:
Припустимо, що спочатку у Боба є відкритий ключ , де — це модуль, а — публічна експонента ключа.
- Аліса вибирає випадковий маскуючий множник , взаємно простий з , і обчислює .
- Аліса відсилає по відкритому каналу Бобу.
- Боб обчислює , використовуючи свій закритий ключ.
- Боб відсилає назад Алісі.
- Аліса прибирає своє початкове маскування і отримує підписане Бобом вихідне повідомлення наступним чином: .
Чаум придумав ціле сімейство більш складних алгоритмів сліпого підпису під загальною назвою несподівані сліпі підписи. Їх схеми ще складніше, але вони дають більше можливостей.
Нехай Аліса хоче підписати повідомлення у Боба таким чином, щоб, по-перше, Боб не міг ознайомитися з повідомленням в ході підпису, по-друге, щоб Боб не міг згодом при отриманні повідомлення і відповідного підпису ідентифікувати користувача, ініціював протокол сліпий підписи для даного конкретного повідомлення (Алісу). Даний протокол реалізується наступним чином:
- Аліса ініціює взаємодію з Бобом.
- Боб відправляє Алісі значення .
- Аліса обчислює значення (w і t — випадкові числа, що не перевищують ), і , після чого відправляє Бобу значення .
- Боб обчислює значення , таке що , і відправляє Алісі.
- Аліса обчислює підпис , де і , яка є справжньою по відношенню до повідомлення [8].
Справжність підпису доводиться наступним чином. З випливає і . При цьому проблема анонімності вирішується, оскільки будь-яка трійка (R, S, E) з безлічі таких трійок, які формувалися Бобом, може бути порівняна з підписом до цього документа . Дійсно, маємо: і , тобто при рівновипадковому випадковому виборі доданків підпис соднаковою ймовірністю була породжена з будь-якої трійки, що входить в множину трійок, сформованих підписувачем. Відзначимо також, що Боб не має навіть можливості довести, що на момент формування підпису даного документа він не був ознайомлений з ним.
p — просте число, 510 ≤ |p| ≤ 512 (або 1022 ≤ |p| ≤ 1024), де |p| — розрядність двійкового подання числа p.
q — великий простий дільник числа p-1, 255 ≤ |q| ≤ 256 (або 511 ≤ |q| ≤ 512)
α ≠ 1, α < p, mod p = 1.
- Необхідно згенерувати випадкове k, 1 < k < q;
- R = ( mod p) mod q — перша частина підпису;
- H = Hash(m), де Hash — хеш-функція, описана в стандарті ГОСТ Р 34.11-94, m — повідомлення, яке підписується ;
- S = kH + zR mod q, де z — закритий ключ.
- Якщо S=0, то повторити операції 1-4.
- Якщо R < q або S < q, то підпис недійсний. Інакше:
- R' = ( mod p) mod q, де y — відкритий ключ;
- Якщо R = R', то підпис дійсний[9].
Стандарт Білорусі передбачає наступний протокол генерації сліпого підпису до документа M:
- Необхідно згенерувати випадкове k таке, що 1 < k < q і обчислити . Ці дії виконує підписувач. Далі він передає число R користувачеві;
- Користувач генерує випадкові числа ε і τ такі, що 1 < ε, τ < q і потім обчислює , і E = E' — τ mod q; E — перший елемент підпису — направляється підписувачу;
- Підписує обчислює другий елемент підпису S = (k — xE) mod q і передає S користувачеві;
- Користувач обчислює S' = S + ε mod q.
В даному описі використані наступні параметри: q — модуль, за яким ведуться обчислення, просте; a — породжує елемент; x — закритий ключ; y — відкритий ключ[9].
Нехай — відкриті ключі, якими володіють s користувачів. Нехай є повідомлення M, яке хочуть підписати m з них. У такому разі всі підписи можна об'єднати в один, довжина якої дорівнює довжині підпису одного користувача і не залежить від m. Це реалізується за правилами наступного протокола:
- Кожний з m користувачів генерує випадкове число < p, де j = , p — велике просте число. Далі кожний з m користувачів обчислює mod p (k — велика проста ступінь) і розсилає це число всім іншим користувачам даної групи.
- Кожен користувач обчислює mod p. Далі обчислюється e = f(R,M) = RH mod q, де q — велике просте число, відмінне від p, H = Hash(M) — хеш-функція. Число e буде першим елементом колективного підпису.
- mod p — частка користувача. Цю частку кожен користувач обчислює і надає іншим.
- Кожен з користувачів далі обчислює mod p. Це другий елемент колективного підпису.
mod p — колективний відкритий ключ. На його основі відбувається перевірка колективного сліпого підпису за наступним алгоритмом:
- Обчислюється mod p.
- Обчислюється e' = f(R,M) = RH mod q
- Якщо e' = e, то підпис дійсний[9].
Найбільш широке застосування протокол сліпих підписів знайшов у сфері цифрових грошей. Наприклад, щоб вкладник не обдурив банк, може використовуватися такий протокол: вкладник пише однаковий номінал купюр на ста документах з різними номерами і депонує в зашифрованому вигляді у банку. Банк вибирає випадковим чином і вимагає розкрити 99 (або n-1) конвертів, переконується, що скрізь написано $10, а не $1000, тоді підписує конверт, що залишився наосліп, не бачачи номера купюри.
Може бути передбачений більш простий варіант: за кожним номіналом купюр у банку закріплена своя пара відкритих ключів. Тоді під підпис надсилається тільки номер купюри, і необхідність перевірки номіналу перед підписом відпадає[1].
Сліпі підписи використовуються для таємного голосування. У протоколі Фуджіока, Окамото і Охта, виборець готує виборчий бюлетень зі своїм вибором, який він зробив, шифрує його секретним ключем, і маскує його. Далі виборець підписує виборчий бюлетень і посилає його валідатору. Валідатор перевіряє, що підпис належить зареєстрованому виборцю, який ще не голосував.
Якщо виборчий бюлетень дійсний, валідатор підписує виборчий бюлетень і повертає його виборцю. Виборець видаляє маскування, розкриваючи таким чином зашифрований виборчий бюлетень, підписаний валідатором. Далі виборець посилає в результаті отриманий підписаний, зашифрований виборчий бюлетень лічильнику, який перевіряє підпис на зашифрованому виборчому бюлетені.
Якщо виборчий бюлетень дійсний, лічильник розміщує його в списку, який буде виданий після всього голосування. Після того, як список виданий, виборці перевіряють, що їх виборчі бюлетені знаходяться в списку і посилають лічильнику ключі розшифрування, необхідні, щоб відкрити їх виборчі бюлетені. Лічильник використовує ці ключі для розшифрування виборчих бюлетенів і додає голос до загального числа. Після виборів лічильник видає ключі розшифрування поряд з зашифрованими виборчими бюлетенями, щоб виборці могли незалежно перевірити вибір[10].
Алгоритм RSA може бути об'єктом атаки, завдяки якій стає можливим розшифрувати раніше підписане наосліп повідомлення, видавши його за повідомлення, яке тільки ще треба підписати. Виходячи з того, що процес підпису еквівалентний розшифровці підписуючою стороною (з використанням секретного ключа), атакуючий може підкласти для підпису вже підписану наосліп версію повідомлення , зашифрованого за допомогою відкритого ключа підписуючої сторони, тобто підкласти повідомлення .
де — це зашифрована версія повідомлення. Коли повідомлення підписане, відкритий текст легко отримуємо:
де — це Функція Ейлера. Тепер повідомлення легко отримати.
Атака працює, тому що в цій схемі підписуюча сторона підписує безпосередньо саме повідомлення. Навпаки, у звичайних схемах підпису підписуюча сторона зазвичай підписує, наприклад, криптографічну хеш-функцію. Тому через цю мультиплікативну властивість RSA, один ключ ніколи не повинен використовуватися одночасно для шифрування і підписання наосліп.
- ↑ а б Брюс Шнайер, «Прикладная криптография. 2-е издание. Протоколы, алгоритмы и исходные тексты на языке С», издательство «Триумф», 2002 г.
- ↑ Жан Каменич, Жан-Марк Пивето, Маркус Штадлер, «Слепые подписи, основанные на задаче дискретного логарифмирования», журнал «Eurocrypt», страницы 428—432, издательство «Springer-Verlag», 1995 г.
- ↑ Чакраборту, Каліан; Мехта, Жан (2012). A stamped blind signature scheme based on elliptic curve discrete logarithm problem. International Journal of Network Security (англ.) (14): 316—319.
- ↑ Лун-Чанг Лин, Мин-Шианг Ханг, Чин-Чен Чанг «Повышение безопасности для анонимного электронного голосования через сеть», журнал «Computer Standards and Interfaces», выпуск 25, страницы 131—139, 2003 г.
- ↑ Татсуаки Окамото, «Эффективная слепая и частично-слепая подписи без случайных предсказаний», сборник статей «Теория Криптографии», страницы 80-99, издательство «Springer-Verlag», 2006 г.
- ↑ Маркус Рукерт, «Слепая подпись на основе решеток», сборник статей конференции Asiacrypt, страницы 413—430, издательство «Springer-Verlag», 2010 г.
- ↑ Даниэль Ортис-Арройо, Клаудия Гарсия-Самора, «Очередное улучшение протокола электронного голосования Му-Варадараджана», журнал «Computer Standards and Interfaces», выпуск 29, страницы 471—480, 2007 г.
- ↑ Молдовян Н.А. Практикум по криптосистемам с открытым ключом. — 2007. — 304 с. — ISBN 5-9775-0024-6.
- ↑ а б в Н.А. Молдовян. Теоретический минимум и алгоритмы цифровой подписи. — БВХ-Петербург, 2010. — 304 с. — ISBN 978-5-9775-0585-7.
- ↑ Анисимов В.В. Протоколы двух агентств Фудзиока-Окамото-Охта и Sensus. Криптографические методы защиты информации.
- Шнайер, Б. Прикладная криптография. 2-е издание. Протоколы, алгоритмы и исходные тексты на языке С — «Триумф», 2002 г.
- Клюжев А. Электронное голосование, 2003 г.
- Шаньгин, В. Ф., Соколов, А. В. Защита информации в распределенных корпоративных сетях и системах — «ДМК», 2002 г..
- Чаум, Д. Blind signatures for untraceable payments — «Springer-Verlag», 1998 г..
- Молдовян Н. А. Практикум по криптосистемам с открытым ключом, 2007 г.
- Молдовян Н. А. Теоретический минимум и основы цифровой подписи, 2010 г.